// 防止头文件重复包含
#ifndef COMMON_H
#define COMMON_H

// 包含必要的系统头文件
#include <sys/types.h>      // 包含数据类型定义
#include <time.h>           // 包含时间处理函数
#include <sys/ipc.h>        // 包含IPC(进程间通信)相关定义
#include <sys/msg.h>        // 包含消息队列相关定义
#include <fcntl.h>          // 包含文件控制选项
#include <pthread.h>        // 包含POSIX线程相关定义
#include <stdio.h>          // 包含标准输入输出函数
#include <stdlib.h>         // 包含标准库函数
#include <dirent.h>         // 包含目录操作函数

// 定义任务类型枚举
typedef enum {
    TASK_FILE_TRANSFER,     // 文件传输任务
    TASK_STRING_STORE,      // 字符串存储任务
    TASK_QUERY_FILES,       // 查询文件任务
    TASK_QUERY_TASKS,       // 查询任务列表任务
    TASK_COMPUTE            // 计算任务
} TaskType;

// 定义任务状态枚举
typedef enum {
    TASK_PENDING,           // 任务待处理
    TASK_RUNNING,           // 任务运行中
    TASK_COMPLETED          // 任务已完成
} TaskStatus;

// 定义任务数据结构
typedef struct {
    pid_t sender_pid;       // 发送方进程ID
    TaskType type;          // 任务类型
    time_t start_time;      // 任务开始时间
    time_t end_time;        // 任务结束时间
    TaskStatus status;      // 任务状态
    char data[1024];        // 任务数据（根据任务类型存储不同内容）
    char result[2048];      // 任务执行结果
    double exec_time;       // 任务执行总时间（秒）
} Task;

// 定义任务链表节点结构
typedef struct TaskNode {
    Task task;              // 任务数据
    struct TaskNode* next;  // 指向下一个节点的指针
} TaskNode;

// 定义消息队列消息结构
typedef struct {
    long mtype;             // 消息类型（必须为正数）
    Task task;              // 任务数据
} TaskMessage;

// 定义IPC常量
#define MSG_QUEUE_KEY 0x1234    // 消息队列键值
#define PIPE_PATH "/tmp/task_pipe"  // 命名管道路径

// 声明全局任务链表头指针和互斥锁
extern TaskNode* task_list_head;        // 任务链表头节点
extern pthread_mutex_t task_list_mutex; // 任务链表互斥锁

// 声明函数原型
void add_task_to_list(Task* task);  // 将任务添加到链表中
void free_task_list();              // 释放整个任务链表内存

// 结束防止头文件重复包含
#endif